home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Browsers, Managers & Extensions / CookieSwap 0.5 / cookieswap-0.5.0-fx.xpi / chrome / chromeFiles / content / cookieProfile.js < prev    next >
Text File  |  2007-07-22  |  12KB  |  248 lines

  1. // *****************************************************************************
  2. // *                        CookieProfile Class                                *
  3. // *                                                                           *
  4. // ************************** Coding Standards *********************************
  5. // *  gMyVariable     - global variable (starts with "g", then mixed case)     *
  6. // *  myVariable      - variables passed into functions                        *
  7. // *  my_variable     - local variable inside of a function                    *
  8. // *  this.myVariable - class attributes/variable (mixed case & always         *
  9. // *                    referenced with "this.")                               *
  10. // *  MyFunction      - functions are always mixed case                        *
  11. // *  MY_CONSTANT     - constants are all caps with underscores                *
  12. // *                                                                           *
  13. // *************************** Revision History ********************************
  14. // *  Name       Date       BugzID  Action                                     *
  15. // *  ---------  ---------  -----   ------                                     *
  16. // *  SteveTine  28Dec2005  12561   Initial Creation                           *
  17. // *  SteveTine  11Jan2006  12720   Fixing the way session cookies are handled *
  18. // *  SteveTine  30Sep2006  15281   Adding setFileHandle method                *
  19. // *  SteveTine  16Jan2006  Trac9   Create cs_Cookie instead of Cookie class   *
  20. // *                                                                           *
  21. // ************************* BEGIN LICENSE BLOCK *******************************
  22. // * Version: MPL 1.1                                                          *
  23. // *                                                                           *
  24. // *The contents of this file are subject to the Mozilla Public License Version*
  25. // * 1.1 (the "License"); you may not use this file except in compliance with  *
  26. // * the License. You may obtain a copy of the License at                      *
  27. // * http://www.mozilla.org/MPL/                                               *
  28. // *                                                                           *
  29. // * Software distributed under the License is distributed on an "AS IS" basis,*
  30. // * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License  *
  31. // * for the specific language governing rights and limitations under the      *
  32. // * License.                                                                  *
  33. // *                                                                           *
  34. // * The Original Code is the CookieSwap Mozilla/Firefox Extension             *
  35. // *                                                                           *
  36. // * The Initial Developer of the Original Code is                             *
  37. // * Steven Tine.                                                              *
  38. // * Portions created by the Initial Developer are Copyright (C) 2006          *
  39. // * the Initial Developer. All Rights Reserved.                               *
  40. // *                                                                           *
  41. // * Contributor(s): Steven Tine                                               *
  42. // *                                                                           *
  43. // **************************END LICENSE BLOCK**********************************
  44.  
  45. const FLAGS_PR_RDONLY      = 0x01; //Open for reading only.
  46. const FLAGS_PR_WRONLY      = 0x02; //Open for writing only.
  47. const FLAGS_PR_RDWR        = 0x04; //Open for reading and writing.
  48. const FLAGS_PR_CREATE_FILE = 0x08; //If the file does not exist, the file is created.
  49. const FLAGS_PR_APPEND      = 0x10; //The file pointer is set to the end of the file prior to each write.
  50. const FLAGS_PR_TRUNCATE    = 0x20; //If the file exists, its length is truncated to 0.
  51. const FLAGS_PR_SYNC        = 0x40; //If set, each write will wait for both the file data and file status 
  52.                                    //  to be physically updated.
  53. const FLAGS_PR_EXCL        = 0x80; //With PR_CREATE_FILE, if the file does not exist, the file is created. 
  54.                                    //  If the file already exists, no action and NULL is returned
  55.  
  56. const COOKIE_FILE_PERMISSIONS = 0600;  //User read/write only (matches Linux cookies.txt file perm)
  57. const COOKIE_FILE_READ_FLAGS  = FLAGS_PR_RDONLY;
  58. const COOKIE_FILE_WRITE_FLAGS = FLAGS_PR_WRONLY | FLAGS_PR_CREATE_FILE | FLAGS_PR_TRUNCATE;
  59.  
  60. const CS_NEW_LINE = "\n";  //"\r\n"
  61. const COOKIE_FILE_HDR = 
  62.     "#This file was created by the CookieSwap extension...see cookieswap.mozdev.org" + CS_NEW_LINE + 
  63.     "#NOTE: if this file's extension is 'tx1' then this is an" + CS_NEW_LINE + 
  64.     "# active profile and the cookies in here are old and will be overwritten by the " +  CS_NEW_LINE + 
  65.     "# cookies being managed by the browser" + CS_NEW_LINE;
  66.  
  67. //-------------CookieProfile class definition--------------
  68. //This class abstracts the idea of how a profile is persistently stored.  This class
  69. //  also knows how to copy cookies to/from the browser.
  70. //Input: fileName - nsIFile object where the persistent info of this class is stored
  71. function CookieProfile(fileName)
  72. {
  73.    //Define a debug function for the class...change true/false to turn it on/off
  74.    this.classDump=function(s){true ? cookieswap_dbg("[CookieProfile]" + s) : (s)}
  75.  
  76.    //This is the way to call the debug function
  77.    this.classDump("START ctor");
  78.  
  79.    //--Create some attributes
  80.  
  81.    //nsIFile object identifying where the persistent info of this class is stored
  82.    this.fileName = fileName;
  83.  
  84.    //We need to keep track of if this is the first time this profile is being
  85.    //  swapped in for this running of the browser.  If the user just started
  86.    //  the browser up and they are swapping in this profile for the first time,
  87.    //  "session" cookies (one that expire at the end of the browser session) should
  88.    //  not be swapped in (they should be deleted).
  89.    //But, if the session cookies were swapped out to this profile in the same browser
  90.    //  session, then they should be swapped in also.
  91.    this.cookiesCameFromThisSession = false;
  92.  
  93.    this.classDump("END ctor");
  94. }
  95.  
  96. //Returns NsIFile
  97. CookieProfile.prototype.getFileHandle = function()
  98. {
  99.    return(this.fileName);
  100. }
  101.  
  102. //Sets the NsIFile
  103. CookieProfile.prototype.setFileHandle = function(newFile)
  104. {
  105.    this.fileName = newFile;
  106. }
  107.  
  108. //NOTE this method will copy all the cookies in the Profile to the browser.  It
  109. //  will NOT delete the cookies currently in the browser so the caller should
  110. //  remove the browser cookies first if that is desired.
  111. CookieProfile.prototype.copyToBrowser = function()
  112. {
  113.    var istream = Components.classes["@mozilla.org/network/file-input-stream;1"]
  114.                            .createInstance(Components.interfaces.nsIFileInputStream);
  115.    var cookie_svc=ffGetCookieService();
  116.    var i=0;
  117.    var file_valid=true;
  118.    
  119.    this.classDump("Opening " + this.fileName.leafName + " file for reading");
  120.  
  121.    try
  122.    {
  123.       istream.init(this.fileName, COOKIE_FILE_READ_FLAGS, COOKIE_FILE_PERMISSIONS, 0);
  124.       this.classDump("Open, converting to nsILineInputStream");
  125.       istream.QueryInterface(Components.interfaces.nsILineInputStream);
  126.    }
  127.    catch (e)
  128.    {
  129.       this.classDump("init failed=>" + e);
  130.       file_valid=false;
  131.    }
  132.  
  133.    if (file_valid == true)
  134.    {
  135.       this.classDump("Open...reading");
  136.  
  137.       //read lines into array
  138.       var line = {};
  139.       var hasmore;
  140.    
  141.       do
  142.       {
  143.          hasmore = istream.readLine(line);
  144.          var str_line = new String(line.value);  //Convert to a more convienent String object
  145.      
  146.          //this.classDump("DataRead(" + str_line.length + ")=" + str_line);
  147.  
  148.          //Make sure there is data on the line and it is not a comment
  149.          if ((str_line.length > 0) && (str_line.charAt(0) != '#'))
  150.          {
  151.             var  curr_cookie = new cs_Cookie(str_line);
  152.         
  153.             if (curr_cookie.isValid == true)
  154.             {
  155.                //If the cookies in the profile file did not come from this session of the browser
  156.                //  and they are session cookies, then we don't want to swap them in.
  157.                if ((this.cookiesCameFromThisSession == false) && (curr_cookie.isSessionCookie() == true) )
  158.                {
  159.                   this.classDump("Excluding session cookie from swap because we are running a new" +
  160.                                  "browser session (" + curr_cookie.getCookieString() + ")" );
  161.                }
  162.                else
  163.                {
  164.                   //this.classDump("Adding cookie=" + curr_cookie.getCookieUrl().spec + "=>" + curr_cookie.getCookieString());
  165.                   cookie_svc.setCookieString(curr_cookie.getCookieUrl(), 
  166.                                              null, 
  167.                                              curr_cookie.getCookieString(), 
  168.                                              null);
  169.                   i++;  //Increment the valid cookie count
  170.                }
  171.             }
  172.             else
  173.             {
  174.                this.classDump("Non-comment line was invalid => " + str_line);
  175.             }
  176.          }
  177.       } while(hasmore);
  178.    
  179.       this.classDump("Closing");
  180.       istream.close();
  181.    }
  182.    else
  183.    {
  184.       alert("[CookieSwap] Warning, unable to locate file associated with selected profile.\n" +
  185.             "Expected filename=" + this.fileName.leafName + "\n" +
  186.             "Full path=" + this.fileName.path);
  187.       this.classDump("Unable to open " + this.fileName.path);
  188.    }
  189.  
  190.    this.classDump("Copied " + i + " cookies from the profile to the browser" );
  191.  
  192. }
  193.  
  194. //This method will copy all the cookies in the browser's memory to the
  195. // persistent storage of this profile (replacing all that were
  196. // currently in the storage)
  197. CookieProfile.prototype.copyFromBrowser = function()
  198. {
  199.    var cookie_mgr = ffGetCookieManager();
  200.    var cookie_iter = cookie_mgr.enumerator;
  201.    var curr_cookie;
  202.    var i;
  203.    var file_out_stream = ffGetFileOutputStream();
  204.  
  205.    this.classDump("opening " + this.fileName.leafName + " for writing");
  206.    file_out_stream.init(this.fileName, COOKIE_FILE_WRITE_FLAGS, COOKIE_FILE_PERMISSIONS, 0);
  207.  
  208.    //Write the header to the file
  209.    tmp_string = COOKIE_FILE_HDR;
  210.    file_out_stream.write(tmp_string, tmp_string.length);
  211.  
  212.    this.classDump("Header written");
  213.  
  214.    for (i=0;cookie_iter.hasMoreElements();i++)
  215.    {
  216.       curr_cookie = cookie_iter.getNext();
  217.  
  218.       //Cast the cookie (sorry for the "C" term) to an nsICookie
  219.       if (curr_cookie instanceof Components.interfaces.nsICookie)
  220.       {
  221.           var tmp_string;
  222.           var tmp_cookie;
  223.    
  224.           //this.classDump("Constructing new cookie");
  225.  
  226.           //Conver the cookie to a "cs_Cookie" class so we can get the FileString
  227.           tmp_cookie = new cs_Cookie(curr_cookie);
  228.           //this.classDump("I have the new cookie");
  229.  
  230.           //Append the cookie to the global cookie store
  231.           tmp_string = tmp_cookie.getCookieFileString() + CS_NEW_LINE;
  232.           file_out_stream.write(tmp_string, tmp_string.length);
  233.  
  234.           tmp_string = tmp_cookie.getCookieUrl().spec + CS_NEW_LINE + 
  235.                        tmp_cookie.getCookieString() + CS_NEW_LINE;
  236.       }
  237.    }
  238.  
  239.    //Need to keep track that the cookies in the profile were taken from this
  240.    //  running of the browser session.  See the attribute definition for more
  241.    //  details on this.
  242.    this.cookiesCameFromThisSession = true;
  243.  
  244.    this.classDump("Copied " + i + " cookies from browser to the profile file");
  245.    file_out_stream.close();
  246. }
  247.  
  248.